/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import common.Constants;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import jpa.ApprovazioneArticolo;
import jpa.Articolo;
import jpa.Corsi;
import jpa.Pubblicazione;
import jpa.PubblicazioneTemp;
import jpa.Studente;
import jpa.Tutor;

/**
 *
 * @author admin
 */
@Stateless
public class GestoreArticolo implements GestoreArticoloLocal {

    @PersistenceContext
    private EntityManager em;

    public List<Articolo> ricerca(String termine, String cosa) {
        if (cosa.equals("corso")) {
            return cercaPerCorso(termine);
        }
        if (cosa.equals("studente")) {
            return cercaPerStudente(termine);
        }
        return cercaPerTitolo(termine);
    }

    @Override
    public void riempiDB() {

        PubblicazioneTemp p = new PubblicazioneTemp();
        p.setTitolo("ciao");
        p.setLink(Constants.FILE_DIR + "prova.txt");
        p.setData(new Date());
        em.persist(p);
        em.flush();

    }

    @Override
    public boolean pubblicaStudente(Date d, String titolo, String link, int idStudente, int corsoid) {
        PubblicazioneTemp pub = new PubblicazioneTemp();
        pub.setData(d);
        pub.setTitolo(titolo);
        pub.setLink(link);
        pub.setStudenteid(idStudente);
        pub.setCorsoid(corsoid);
        em.persist(pub);
        return true;
    }

    @Override
    public List<Integer> articoliDaApprovare(int start, int end) {
        List<Integer> result;
        Query query = em.createQuery("SELECT p.id FROM PubblicazioneTemp p");
        query = query.setFirstResult(start);
        query = query.setMaxResults(end);
        result = query.getResultList();
        return result;
    }

    @Override
    public PubblicazioneTemp articoloDaApprovare(int key) {
        PubblicazioneTemp p;
        Query query = em.createNamedQuery("PubblicazioneTemp.findById");
        query.setParameter("id", key);
        p = (PubblicazioneTemp) query.getSingleResult();
        return p;
    }

    @Override
    public boolean approvaArticolo(int idPubTemp, int idTutor) {
        PubblicazioneTemp tmp = em.find(PubblicazioneTemp.class, idPubTemp);
        Articolo a = new Articolo();
        Pubblicazione p = new Pubblicazione();
        ApprovazioneArticolo appA = new ApprovazioneArticolo();
        p.setData(tmp.getData());
        p.setStudenteid(tmp.getStudenteid());
        p.setTutorid(idTutor);
        appA.setData(new Date());
        appA.setTutorid(idTutor);
        em.persist(p);
        em.flush();
        em.persist(appA);
        em.flush();
        a.setPubblicazioneid(p.getId());
        a.setTitolo(tmp.getTitolo());
        a.setLink(tmp.getLink());
        a.setCorsiid(tmp.getCorsoid());
        a.setApprovazioneArticoloid(appA.getId());
        em.persist(a);
        em.flush();
        em.remove(tmp);
        em.flush();
        return true;
    }

    @Override
    public boolean eliminaArticoloApprovare(int idPubbTemp) {
        PubblicazioneTemp tmp = em.find(PubblicazioneTemp.class, idPubbTemp);
        em.remove(tmp);
        em.flush();
        return true;
    }

    @Override
    public List<Articolo> listaArticoli() {
        List<Articolo> result = new LinkedList<>();
        Query query = em.createNamedQuery("Articolo.findAll");
        return query.getResultList();
    }

    @Override
    public String chiApprovato(Integer tutorid) {
        Tutor t = em.find(Tutor.class, tutorid);
        return t.getCognome() + " " + t.getNome();
    }

    @Override
    public String chiPubblicato(Integer pubblicazioneid) {
        Pubblicazione p = em.find(Pubblicazione.class, pubblicazioneid);
        if (p.getStudenteid() == 0) {
            return "Tutor - " + tutor(p.getTutorid());
        }
        return "Studente - " + studente(p.getStudenteid());
    }

    private String tutor(Integer tutorid) {
        Tutor t = em.find(Tutor.class, tutorid);
        return t.getCognome() + " " + t.getNome();
    }

    private String studente(Integer studenteid) {
        Studente t = em.find(Studente.class, studenteid);
        return t.getCognome() + " " + t.getNome();
    }

    public String quandoPubblicato(Integer pubblicazioneid) {
        Pubblicazione p = em.find(Pubblicazione.class, pubblicazioneid);
        Date d = p.getData();
        int m = d.getMonth() + 1;
        int a = d.getYear() + 1900;
        String data = d.getDate() + "/" + m + "/" + a + " ore " + d.getHours() + ":" + d.getMinutes();
        return data;
    }

    @Override
    public String corsoAppartenenza(Integer corsiid) {
        return em.find(Corsi.class, corsiid).getNome();
    }

    @Override
    public LinkedList<String[]> articoli(int start, int end) {
        LinkedList<String[]> result = new LinkedList<>();
        Query query = em.createNamedQuery("Articolo.findAll");
        query = query.setFirstResult(start);
        query = query.setMaxResults(end);
        List<Articolo> tmp = query.getResultList();
        Iterator it = tmp.iterator();
        while (it.hasNext()) {
            String[] ris = new String[5];
            Articolo a = (Articolo) it.next();
            ris[0] = a.getTitolo();
            ris[1] = a.getLink();
            ApprovazioneArticolo t = em.find(ApprovazioneArticolo.class, a.getApprovazioneArticoloid());
            Tutor tut = em.find(Tutor.class, t.getTutorid());
            ris[2] = tut.getNome() + " " + tut.getCognome();
            Pubblicazione p = em.find(Pubblicazione.class, a.getPubblicazioneid());
            ris[3] = p.getData().toGMTString();
            ris[4] = em.find(Corsi.class, a.getCorsiid()).getNome();
            result.add(ris);
        }
        return result;
    }

    public int numeroArticoli() {
        Long result = (Long) em.createNamedQuery("Articolo.countArticolo").getSingleResult();
        return result.intValue();
    }

    private List<Articolo> cercaPerTitolo(String termine) {
        List<Articolo> result = new LinkedList<>();
        String que = "Select a From Articolo a Where a.titolo like '%" + termine + "%'";
        Query query = em.createQuery(que);
        result = query.getResultList();
        return result;
    }

    private List<Articolo> cercaPerCorso(String termine) {
        List<Articolo> result = new LinkedList<>();
        String que = "Select c From Corsi c Where c.nome like '%" + termine + "%'";
        Query query = em.createQuery(que);
        List<Corsi> corsi = query.getResultList();
        Iterator<Corsi> it = corsi.iterator();
        while (it.hasNext()) {
            Corsi tmp = it.next();
            String que2 = "Select a From Articolo a Where a.corsiid = " + tmp.getId();
            Query query2 = em.createQuery(que2);
            result.addAll(query2.getResultList());
        }
        return result;
    }

    private List<Articolo> cercaPerStudente(String termine) {
        List<Articolo> result = new LinkedList<>();
        String que = "Select s From Studente s Where s.cognome like '%" + termine + "%'";
        Query query = em.createQuery(que);
        List<Studente> studente = query.getResultList();
        Iterator<Studente> it = studente.iterator();
        while (it.hasNext()) {
            Studente tmp = it.next();
            String que2 = "Select p From Pubblicazione p Where p.studenteid = " + tmp.getId();
            Query query2 = em.createQuery(que2);
            List<Pubblicazione> pubb = query2.getResultList();
            Iterator<Pubblicazione> it2 = pubb.iterator();
            while (it2.hasNext()) {
                Pubblicazione pb = it2.next();
                String que3 = "Select a From Articolo a Where a.pubblicazioneid = " + pb.getId();
                Query query3 = em.createQuery(que3);
                result.add((Articolo) query3.getSingleResult());
            }
        }
        return result;
    }

}
